EC-CUBE 2.11.4
[ class tree: EC-CUBE 2.11.4 ] [ index: EC-CUBE 2.11.4 ] [ all elements ]

Source for file SC_Query.php

Documentation is available at SC_Query.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. require_once realpath(dirname(__FILE__)) '/../module/MDB2.php';
  25.  
  26. /**
  27.  * SQLの構築・実行を行う
  28.  *
  29.  * TODO エラーハンドリング, ロギング方法を見直す
  30.  *
  31.  * @author LOCKON CO.,LTD.
  32.  * @version $Id: SC_Query.php 21284 2011-10-18 03:09:15Z Seasoft $
  33.  */
  34. class SC_Query {
  35.  
  36.     var $option = '';
  37.     var $where = '';
  38.     var $arrWhereVal = array();
  39.     var $conn;
  40.     var $groupby = '';
  41.     var $order = '';
  42.     var $force_run;
  43.  
  44.     /**
  45.      * コンストラクタ.
  46.      *
  47.      * @param string $dsn データソース名
  48.      * @param boolean $force_run エラーが発生しても処理を続行する場合 true
  49.      * @param boolean $new 新規に接続を行うかどうか
  50.      */
  51.     function SC_Query($dsn ""$force_run false$new false{
  52.  
  53.         if ($dsn == ""{
  54.             $dsn DEFAULT_DSN;
  55.         }
  56.  
  57.         // Debugモード指定
  58.         // 常時ONにするとメモリが解放されない。
  59.         // 連続クエリ実行時に問題が生じる。
  60.         if(DEBUG_MODE{
  61.             $options['debug'PEAR_DB_DEBUG;
  62.         else {
  63.             $options['debug'0;
  64.         }
  65.  
  66.         // 持続的接続オプション
  67.         $options['persistent'PEAR_DB_PERSISTENT;
  68.  
  69.         // バッファリング trueにするとメモリが解放されない。
  70.         // 連続クエリ実行時に問題が生じる。
  71.         $options['result_buffering'false;
  72.  
  73.         if ($new{
  74.             $this->conn = MDB2::connect($dsn$options);
  75.         else {
  76.             $this->conn = MDB2::singleton($dsn$options);
  77.         }
  78.         if (!PEAR::isError($this->conn)) {
  79.             $this->conn->setCharset("utf8");
  80.             $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
  81.         }
  82.         $this->dbFactory SC_DB_DBFactory_Ex::getInstance();
  83.         $this->force_run = $force_run;
  84.     }
  85.  
  86.     /**
  87.      * シングルトンの SC_Query インスタンスを取得する.
  88.      *
  89.      * @param string $dsn データソース名
  90.      * @param boolean $force_run エラーが発生しても処理を続行する場合 true
  91.      * @param boolean $new 新規に接続を行うかどうか
  92.      * @return SC_Query シングルトンの SC_Query インスタンス
  93.      */
  94.     function getSingletonInstance($dsn ""$force_run false$new false{
  95.         if (!isset($GLOBALS['_SC_Query_instance'])
  96.             || is_null($GLOBALS['_SC_Query_instance'])) {
  97.             $GLOBALS['_SC_Query_instance'=new SC_Query_Ex($dsn$force_run$new);
  98.         }
  99.         $GLOBALS['_SC_Query_instance']->where '';
  100.         $GLOBALS['_SC_Query_instance']->arrWhereVal array();
  101.         $GLOBALS['_SC_Query_instance']->order '';
  102.         $GLOBALS['_SC_Query_instance']->groupby '';
  103.         $GLOBALS['_SC_Query_instance']->option '';
  104.         return $GLOBALS['_SC_Query_instance'];
  105.     }
  106.  
  107.     /**
  108.      *  エラー判定を行う.
  109.      *
  110.      * @deprecated PEAR::isError() を使用して下さい
  111.      * @return boolean 
  112.      */
  113.     function isError({
  114.         if(PEAR::isError($this->conn)) {
  115.             return true;
  116.         }
  117.         return false;
  118.     }
  119.  
  120.     /**
  121.      * COUNT文を実行する.
  122.      *
  123.      * @param string $table テーブル名
  124.      * @param string $where where句
  125.      * @param array $arrWhereVal プレースホルダ
  126.      * @return integer 件数
  127.      */
  128.     function count($table$where ""$arrWhereVal array()) {
  129.         if(strlen($where<= 0{
  130.             $sqlse "SELECT COUNT(*) FROM $table";
  131.         else {
  132.             $sqlse "SELECT COUNT(*) FROM $table WHERE $where";
  133.         }
  134.         $sqlse $this->dbFactory->sfChangeMySQL($sqlse);
  135.         return $this->getOne($sqlse$arrWhereVal);
  136.     }
  137.  
  138.     /**
  139.      * SELECT文を実行する.
  140.      *
  141.      * @param string $col カラム名. 複数カラムの場合はカンマ区切りで書く
  142.      * @param string $table テーブル名
  143.      * @param string $where WHERE句
  144.      * @param array $arrWhereVal プレースホルダ
  145.      * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。
  146.      * @return array|null
  147.      */
  148.     function select($col$table$where ""$arrWhereVal array()$fetchmode MDB2_FETCHMODE_ASSOC{
  149.         $sqlse $this->getSql($col$table$where$arrWhereVal);
  150.         return $this->getAll($sqlse$arrWhereVal$fetchmode);
  151.     }
  152.  
  153.     /**
  154.      * 直前に実行されたSQL文を取得する.
  155.      *
  156.      * @param boolean $disp trueの場合、画面出力を行う.
  157.      * @return string SQL文
  158.      */
  159.     function getLastQuery($disp true{
  160.         $sql $this->conn->last_query;
  161.         if ($disp{
  162.             echo $sql ";<br />\n";
  163.         }
  164.         return $sql;
  165.     }
  166.  
  167.     /**
  168.      * トランザクションをコミットする.
  169.      *
  170.      * @return MDB2_OK 成功した場合は MDB2_OK;
  171.      *          失敗した場合は PEAR::Error オブジェクト
  172.      */
  173.     function commit({
  174.         return $this->conn->commit();
  175.     }
  176.  
  177.     /**
  178.      * トランザクションを開始する.
  179.      *
  180.      * @return MDB2_OK 成功した場合は MDB2_OK;
  181.      *          失敗した場合は PEAR::Error オブジェクト
  182.      */
  183.     function begin({
  184.         return $this->conn->beginTransaction();
  185.     }
  186.  
  187.     /**
  188.      * トランザクションをロールバックする.
  189.      *
  190.      * @return MDB2_OK 成功した場合は MDB2_OK;
  191.      *          失敗した場合は PEAR::Error オブジェクト
  192.      */
  193.     function rollback({
  194.         return $this->conn->rollback();
  195.     }
  196.  
  197.     /**
  198.      * トランザクションが開始されているかチェックする.
  199.      *
  200.      * @return boolean トランザクションが開始されている場合 true
  201.      */
  202.     function inTransaction({
  203.         return $this->conn->inTransaction();
  204.     }
  205.  
  206.     /**
  207.      * 更新系の SQL を実行する.
  208.      *
  209.      * この関数は SC_Query::query() のエイリアスです.
  210.      *
  211.      * FIXME MDB2::exec() の実装であるべき
  212.      */
  213.     function exec($str$arrval array()) {
  214.         return $this->query($str$arrval);
  215.     }
  216.  
  217.     /**
  218.      * クエリを実行し、結果行毎にコールバック関数を適用する
  219.      *
  220.      * @param callback $function コールバック先
  221.      * @param string $sql SQL クエリ
  222.      * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。
  223.      * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
  224.      * @return boolean 結果
  225.      */
  226.     function doCallbackAll($cbFunc$sql$arrval array()$fetchmode MDB2_FETCHMODE_ASSOC{
  227.  
  228.         $sql $this->dbFactory->sfChangeMySQL($sql);
  229.  
  230.         $sth =$this->prepare($sql);
  231.         if (PEAR::isError($sth&& $this->force_run{
  232.             return;
  233.         }
  234.  
  235.         $affected =$this->execute($sth$arrval);
  236.         if (PEAR::isError($affected&& $this->force_run{
  237.             return;
  238.         }
  239.  
  240.         while($data $affected->fetchRow($fetchmode)) {
  241.             $result call_user_func($cbFunc$data);
  242.             if($result === false{
  243.                 break;
  244.             }
  245.         }
  246.         $sth->free();
  247.         return $result;
  248.     }
  249.  
  250.     /**
  251.      * クエリを実行し、全ての行を返す
  252.      *
  253.      * @param string $sql SQL クエリ
  254.      * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。
  255.      * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
  256.      * @return array データを含む2次元配列。失敗した場合に 0 または DB_Error オブジェクトを返します。
  257.      */
  258.     function getAll($sql$arrval array()$fetchmode MDB2_FETCHMODE_ASSOC{
  259.  
  260.         $sql $this->dbFactory->sfChangeMySQL($sql);
  261.  
  262.         $sth =$this->prepare($sql);
  263.         if (PEAR::isError($sth&& $this->force_run{
  264.             return;
  265.         }
  266.  
  267.         $affected =$this->execute($sth$arrval);
  268.         if (PEAR::isError($affected&& $this->force_run{
  269.             return;
  270.         }
  271.  
  272.         return $affected->fetchAll($fetchmode);
  273.     }
  274.  
  275.     /**
  276.      * 構築した SELECT 文を取得する.
  277.      *
  278.      * クラス変数から WHERE 句を組み立てる場合、$arrWhereVal を経由してプレースホルダもクラス変数のもので上書きする。
  279.      * @param string $col SELECT 文に含めるカラム名
  280.      * @param string $table SELECT 文に含めるテーブル名
  281.      * @param string $where SELECT 文に含める WHERE 句
  282.      * @param mixed $arrWhereVal プレースホルダ(参照)
  283.      * @return string 構築済みの SELECT 文
  284.      */
  285.     function getSql($col$table$where ''&$arrWhereVal null{
  286.         $sqlse "SELECT $col FROM $table";
  287.  
  288.         // 引数の$whereを優先する。
  289.         if (strlen($where>= 1{
  290.             $sqlse .= " WHERE $where";
  291.         elseif (strlen($this->where>= 1{
  292.             $sqlse .= " WHERE " $this->where;
  293.             // 実行時と同じくキャストしてから評価する (空文字を要素1の配列と評価させる意図)
  294.             $arrWhereValForEval = (array)$arrWhereVal;
  295.             if (empty($arrWhereValForEval)) {
  296.                 $arrWhereVal $this->arrWhereVal;
  297.             }
  298.         }
  299.  
  300.         $sqlse .= ' ' $this->groupby . ' ' $this->order . ' ' $this->option;
  301.  
  302.         return $sqlse;
  303.     }
  304.  
  305.     /**
  306.      * SELECT 文の末尾に付与する SQL を設定する.
  307.      *
  308.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  309.      *
  310.      * @param string $str 付与する SQL 文
  311.      * @return SC_Query 自分自身のインスタンス
  312.      */
  313.     function setOption($str{
  314.         $this->option = $str;
  315.         return $this;
  316.     }
  317.  
  318.     /**
  319.      * SELECT 文に付与する LIMIT, OFFSET 句を設定する.
  320.      *
  321.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  322.      * TODO MDB2::setLimit() を使用する
  323.      *
  324.      * @param integer $limit LIMIT 句に付与する値
  325.      * @param integer $offset OFFSET 句に付与する値
  326.      * @return SC_Query 自分自身のインスタンス
  327.      */
  328.     function setLimitOffset($limit$offset 0{
  329.         if (is_numeric($limit&& is_numeric($offset)){
  330.  
  331.             $option " LIMIT " $limit;
  332.             $option.= " OFFSET " $offset;
  333.             $this->option .= $option;
  334.         }
  335.         return $this;
  336.     }
  337.  
  338.     /**
  339.      * SELECT 文に付与する GROUP BY 句を設定する.
  340.      *
  341.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  342.      *
  343.      * @param string $str GROUP BY 句に付与する文字列
  344.      * @return SC_Query 自分自身のインスタンス
  345.      */
  346.     function setGroupBy($str{
  347.         if (strlen($str== 0{
  348.             $this->groupby = '';
  349.         else {
  350.             $this->groupby = "GROUP BY " $str;
  351.         }
  352.         return $this;
  353.     }
  354.  
  355.     /**
  356.      * SELECT 文の WHERE 句に付与する AND 条件を設定する.
  357.      *
  358.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  359.      *
  360.      * @param string $str WHERE 句に付与する AND 条件の文字列
  361.      * @return SC_Query 自分自身のインスタンス
  362.      */
  363.     function andWhere($str{
  364.         if($this->where != ""{
  365.             $this->where .= " AND " $str;
  366.         else {
  367.             $this->where = $str;
  368.         }
  369.         return $this;
  370.     }
  371.  
  372.     /**
  373.      * SELECT 文の WHERE 句に付与する OR 条件を設定する.
  374.      *
  375.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  376.      *
  377.      * @param string $str WHERE 句に付与する OR 条件の文字列
  378.      * @return SC_Query 自分自身のインスタンス
  379.      */
  380.     function orWhere($str{
  381.         if($this->where != ""{
  382.             $this->where .= " OR " $str;
  383.         else {
  384.             $this->where = $str;
  385.         }
  386.         return $this;
  387.     }
  388.  
  389.     /**
  390.      * SELECT 文に付与する WHERE 句を設定する.
  391.      *
  392.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  393.      *
  394.      * @param string $where WHERE 句に付与する文字列
  395.      * @param mixed $arrWhereVal プレースホルダ
  396.      * @return SC_Query 自分自身のインスタンス
  397.      */
  398.     function setWhere($where ''$arrWhereVal array()) {
  399.         $this->where = $where;
  400.         $this->arrWhereVal = $arrWhereVal;
  401.         return $this;
  402.     }
  403.  
  404.     /**
  405.      * SELECT 文に付与する ORDER BY 句を設定する.
  406.      *
  407.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  408.      *
  409.      * @param string $str ORDER BY 句に付与する文字列
  410.      * @return SC_Query 自分自身のインスタンス
  411.      */
  412.     function setOrder($str{
  413.         if (strlen($str== 0{
  414.             $this->order = '';
  415.         else {
  416.             $this->order = "ORDER BY " $str;
  417.         }
  418.         return $this;
  419.     }
  420.  
  421.     /**
  422.      * SELECT 文に付与する LIMIT 句を設定する.
  423.      *
  424.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  425.      *
  426.      * @param integer $limit LIMIT 句に設定する値
  427.      * @return SC_Query 自分自身のインスタンス
  428.      */
  429.     function setLimit($limit){
  430.         if is_numeric($limit)){
  431.             $this->option = " LIMIT " .$limit;
  432.         }
  433.         return $this;
  434.     }
  435.  
  436.     /**
  437.      * SELECT 文に付与する OFFSET 句を設定する.
  438.      *
  439.      * この関数で設定した値は SC_Query::getSql() で使用されます.
  440.      *
  441.      * @param integer $offset LIMIT 句に設定する値
  442.      * @return SC_Query 自分自身のインスタンス
  443.      */
  444.     function setOffset($offset{
  445.         if is_numeric($offset)){
  446.             $this->offset " OFFSET " .$offset;
  447.         }
  448.         return $this;
  449.     }
  450.  
  451.     /**
  452.      * INSERT文を実行する.
  453.      *
  454.      * @param string $table テーブル名
  455.      * @param array $sqlval array('カラム名' => '値',...)の連想配列
  456.      * @return 
  457.      */
  458.     function insert($table$sqlval{
  459.         $strcol '';
  460.         $strval '';
  461.         $find false;
  462.  
  463.         if(count($sqlval<= return false;
  464.         foreach ($sqlval as $key => $val{
  465.             $strcol .= $key ',';
  466.             if(strcasecmp("Now()"$val=== 0{
  467.                 $strval .= 'Now(),';
  468.             else if(strcasecmp('CURRENT_TIMESTAMP'$val=== 0{
  469.                 $strval .= 'CURRENT_TIMESTAMP,';
  470.             else {
  471.                 $strval .= '?,';
  472.                 $arrval[$val;
  473.             }
  474.             $find true;
  475.         }
  476.         if(!$find{
  477.             return false;
  478.         }
  479.         // 文末の","を削除
  480.         $strcol preg_replace("/,$/"""$strcol);
  481.         $strval preg_replace("/,$/"""$strval);
  482.         $sqlin "INSERT INTO $table($strcol") VALUES (" $strval ")";
  483.         // INSERT文の実行
  484.         $ret $this->query($sqlin$arrvalfalsenullMDB2_PREPARE_MANIP);
  485.  
  486.         return $ret;
  487.     }
  488.  
  489.     /**
  490.      * UPDATE文を実行する.
  491.      *
  492.      * @param string $table テーブル名
  493.      * @param array $sqlval array('カラム名' => '値',...)の連想配列
  494.      * @param string $where WHERE句
  495.      * @param array $arrWhereVal WHERE句用のプレースホルダ配列 (従来は追加カラム用も兼ねていた)
  496.      * @param array $arrRawSql 追加カラム
  497.      * @param array $arrRawSqlVal 追加カラム用のプレースホルダ配列
  498.      * @return 
  499.      */
  500.     function update($table$sqlval$where ""$arrWhereVal array()$arrRawSql array()$arrRawSqlVal array()) {
  501.         $arrCol array();
  502.         $arrVal array();
  503.         $find false;
  504.  
  505.         foreach ($sqlval as $key => $val{
  506.             if (strcasecmp("Now()"$val=== 0{
  507.                 $arrCol[$key '= Now()';
  508.             else if(strcasecmp('CURRENT_TIMESTAMP'$val=== 0{
  509.                 $arrCol[$key '= CURRENT_TIMESTAMP';
  510.             else {
  511.                 $arrCol[$key '= ?';
  512.                 $arrVal[$val;
  513.             }
  514.             $find true;
  515.         }
  516.  
  517.         if ($arrRawSql != ""{
  518.             foreach($arrRawSql as $key => $val{
  519.                 $arrCol["$key = $val";
  520.             }
  521.         }
  522.  
  523.         $arrVal array_merge($arrVal$arrRawSqlVal);
  524.  
  525.         if (empty($arrCol)) {
  526.             return false;
  527.         }
  528.  
  529.         // 文末の","を削除
  530.         $strcol implode(', '$arrCol);
  531.  
  532.         if (is_array($arrWhereVal)) // 旧版との互換用
  533.             // プレースホルダー用に配列を追加
  534.             $arrVal array_merge($arrVal$arrWhereVal);
  535.         }
  536.  
  537.         $sqlup "UPDATE $table SET $strcol";
  538.         if (strlen($where>= 1{
  539.             $sqlup .= " WHERE $where";
  540.         }
  541.  
  542.         // UPDATE文の実行
  543.         return $this->query($sqlup$arrValfalsenullMDB2_PREPARE_MANIP);
  544.     }
  545.  
  546.     /**
  547.      * MAX文を実行する.
  548.      *
  549.      * @param string $table テーブル名
  550.      * @param string $col カラム名
  551.      * @param string $where 付与する WHERE 句
  552.      * @param array $arrval プレースホルダに挿入する値
  553.      * @return integer MAX文の実行結果
  554.      */
  555.     function max($col$table$where ""$arrval array()) {
  556.         $ret $this->get("MAX($col)"$table$where$arrval);
  557.         return $ret;
  558.     }
  559.  
  560.     /**
  561.      * MIN文を実行する.
  562.      *
  563.      * @param string $table テーブル名
  564.      * @param string $col カラム名
  565.      * @param string $where 付与する WHERE 句
  566.      * @param array $arrval プレースホルダに挿入する値
  567.      * @return integer MIN文の実行結果
  568.      */
  569.     function min($col$table$where ""$arrval array()) {
  570.         $ret $this->get("MIN($col)"$table$where$arrval);
  571.         return $ret;
  572.     }
  573.  
  574.     /**
  575.      * SQL を構築して, 特定のカラムの値を取得する.
  576.      *
  577.      * @param string $table テーブル名
  578.      * @param string $col カラム名
  579.      * @param string $where 付与する WHERE 句
  580.      * @param array $arrWhereVal プレースホルダに挿入する値
  581.      * @return mixed SQL の実行結果
  582.      */
  583.     function get($col$table$where ""$arrWhereVal array()) {
  584.         $sqlse $this->getSql($col$table$where$arrWhereVal);
  585.         // SQL文の実行
  586.         $ret $this->getOne($sqlse$arrWhereVal);
  587.         return $ret;
  588.     }
  589.  
  590.     /**
  591.      * SQL を指定して, 特定のカラムの値を取得する.
  592.      *
  593.      * @param string $sql 実行する SQL
  594.      * @param array $arrval プレースホルダに挿入する値
  595.      * @return mixed SQL の実行結果
  596.      */
  597.     function getOne($sql$arrval array()) {
  598.  
  599.         $sql $this->dbFactory->sfChangeMySQL($sql);
  600.  
  601.         $sth =$this->prepare($sql);
  602.         if (PEAR::isError($sth&& $this->force_run{
  603.             return;
  604.         }
  605.  
  606.         $affected =$this->execute($sth$arrval);
  607.         if (PEAR::isError($affected&& $this->force_run{
  608.             return;
  609.         }
  610.  
  611.         return $affected->fetchOne();
  612.     }
  613.  
  614.     /**
  615.      * 一行をカラム名をキーとした連想配列として取得
  616.      *
  617.      * @param string $table テーブル名
  618.      * @param string $col カラム名
  619.      * @param string $where WHERE句
  620.      * @param array $arrWhereVal プレースホルダ配列
  621.      * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。
  622.      * @return array array('カラム名' => '値', ...)の連想配列
  623.      */
  624.     function getRow($col$table$where ""$arrWhereVal array()$fetchmode MDB2_FETCHMODE_ASSOC{
  625.  
  626.         $sql $this->getSql($col$table$where$arrWhereVal);
  627.         $sql $this->dbFactory->sfChangeMySQL($sql);
  628.  
  629.         $sth =$this->prepare($sql);
  630.         if (PEAR::isError($sth&& $this->force_run{
  631.             return;
  632.         }
  633.  
  634.         $affected =$this->execute($sth$arrWhereVal);
  635.         if (PEAR::isError($affected&& $this->force_run{
  636.             return;
  637.         }
  638.  
  639.         return $affected->fetchRow($fetchmode);
  640.     }
  641.  
  642.     /**
  643.      * SELECT 文の実行結果を 1列のみ取得する.
  644.      *
  645.      * @param string $table テーブル名
  646.      * @param string $col カラム名
  647.      * @param string $where 付与する WHERE 句
  648.      * @param array $arrWhereVal プレースホルダに挿入する値
  649.      * @return array SQL の実行結果の配列
  650.      */
  651.     function getCol($col$table$where ""$arrWhereVal array()) {
  652.         $sql $this->getSql($col$table$where$arrWhereVal);
  653.         $sql $this->dbFactory->sfChangeMySQL($sql);
  654.  
  655.         $sth =$this->prepare($sql);
  656.         if (PEAR::isError($sth&& $this->force_run{
  657.             return;
  658.         }
  659.  
  660.         $affected =$this->execute($sth$arrWhereVal);
  661.         if (PEAR::isError($affected&& $this->force_run{
  662.             return;
  663.         }
  664.  
  665.         return $affected->fetchCol();
  666.     }
  667.  
  668.     /**
  669.      * レコードの削除
  670.      *
  671.      * @param string $table テーブル名
  672.      * @param string $where WHERE句
  673.      * @param array $arrval プレースホルダ
  674.      * @return 
  675.      */
  676.     function delete($table$where ""$arrval array()) {
  677.         if(strlen($where<= 0{
  678.             $sqlde "DELETE FROM $table";
  679.         else {
  680.             $sqlde "DELETE FROM $table WHERE $where";
  681.         }
  682.         $ret $this->query($sqlde$arrvalfalsenullMDB2_PREPARE_MANIP);
  683.         return $ret;
  684.     }
  685.  
  686.     /**
  687.      * 次のシーケンス値を取得する.
  688.      *
  689.      * @param string $seq_name 取得するシーケンス名
  690.      * @param integer 次のシーケンス値
  691.      */
  692.     function nextVal($seq_name{
  693.         return $this->conn->nextID($seq_name);
  694.     }
  695.  
  696.     /**
  697.      * 現在のシーケンス値を取得する.
  698.      *
  699.      * @param string $seq_name 取得するシーケンス名
  700.      * @return integer 現在のシーケンス値
  701.      */
  702.     function currVal($seq_name{
  703.         return $this->conn->currID($seq_name);
  704.     }
  705.  
  706.     /**
  707.      * シーケンス値を設定する.
  708.      *
  709.      * @param string $seq_name シーケンス名
  710.      * @param integer $start 設定するシーケンス値
  711.      * @return MDB2_OK 
  712.      */
  713.     function setVal($seq_name$start{
  714.         $objManager =$this->conn->loadModule('Manager');
  715.         // XXX エラーハンドリングを行う
  716.         $objManager->dropSequence($seq_name);
  717.         return $objManager->createSequence($seq_name$start);
  718.     }
  719.  
  720.     /**
  721.      * SQL を実行する.
  722.      *
  723.      * FIXME $ignore_errが無視されるようになっているが互換性として問題が無いか確認が必要
  724.      *
  725.      * @param string $n 実行する SQL 文
  726.      * @param array $arr プレースホルダに挿入する値
  727.      * @param boolean $ignore_err MDB2切替で無効化されている (エラーが発生しても処理を続行する場合 true)
  728.      * @param mixed $types プレースホルダの型指定 デフォルトnull = string
  729.      * @param mixed $result_types 返値の型指定またはDML実行(MDB2_PREPARE_MANIP)
  730.      * @return array SQL の実行結果の配列
  731.      */
  732.     function query($n ,$arr array()$ignore_err false$types null$result_types MDB2_PREPARE_RESULT ){
  733.  
  734.         $n $this->dbFactory->sfChangeMySQL($n);
  735.  
  736.         $sth =$this->prepare($n$types$result_types);
  737.         if (PEAR::isError($sth&& $this->force_run{
  738.             return $sth;
  739.         }
  740.  
  741.         $result $this->execute($sth$arr);
  742.         if (PEAR::isError($result&& $this->force_run{
  743.             return $sth;
  744.         }
  745.  
  746.         //PREPAREの解放
  747.         $sth->free();
  748.  
  749.         return $result;
  750.     }
  751.  
  752.     /**
  753.      * シーケンスの一覧を取得する.
  754.      *
  755.      * @return array シーケンス名の配列
  756.      */
  757.     function listSequences({
  758.         $objManager =$this->conn->loadModule('Manager');
  759.         return $objManager->listSequences();
  760.     }
  761.  
  762.     /**
  763.      * テーブル一覧を取得する.
  764.      *
  765.      * @return array テーブル名の配列
  766.      */
  767.     function listTables({
  768.         $objManager =$this->conn->loadModule('Manager');
  769.         return $objManager->listTables();
  770.     }
  771.  
  772.     /**
  773.      * テーブルのカラム一覧を取得する.
  774.      *
  775.      * @param string $table テーブル名
  776.      * @return array 指定のテーブルのカラム名の配列
  777.      */
  778.     function listTableFields($table{
  779.         $objManager =$this->conn->loadModule('Manager');
  780.         return $objManager->listTableFields($table);
  781.     }
  782.  
  783.     /**
  784.      * テーブルのインデックス一覧を取得する.
  785.      *
  786.      * @param string $table テーブル名
  787.      * @return array 指定のテーブルのインデックス一覧
  788.      */
  789.     function listTableIndexes($table{
  790.         $objManager =$this->conn->loadModule('Manager');
  791.         return $objManager->listTableIndexes($table);
  792.     }
  793.  
  794.     /**
  795.      * テーブルにインデックスを付与する
  796.      *
  797.      * @param string $table テーブル名
  798.      * @param string $name インデックス名
  799.      * @param array $definition フィールド名など 通常のフィールド指定時は、$definition=array('fields' => array('フィールド名' => array()));
  800.      *                MySQLのtext型フィールドを指定する場合は $definition['length'] = 'text_field(NNN)' が必要
  801.      */
  802.     function createIndex($table$name$definition{
  803.         $definition $this->dbFactory->sfGetCreateIndexDefinition($table$name$definition);
  804.         $objManager =$this->conn->loadModule('Manager');
  805.         return $objManager->createIndex($table$name$definition);
  806.     }
  807.  
  808.     /**
  809.      * テーブルにインデックスを破棄する
  810.      *
  811.      * @param string $table テーブル名
  812.      * @param string $name インデックス名
  813.      */
  814.     function dropIndex($table$name{
  815.         $objManager =$this->conn->loadModule('Manager');
  816.         return $objManager->dropIndex($table$name);
  817.     }
  818.  
  819.     /**
  820.      * テーブルの詳細情報を取得する。
  821.      *
  822.      * @param string $table テーブル名
  823.      * @return array テーブル情報の配列
  824.      */
  825.     function getTableInfo($table{
  826.         $objManager =$this->conn->loadModule('Reverse');
  827.         return $objManager->tableInfo($tableNULL);
  828.     }
  829.  
  830.     /**
  831.      * 値を適切にクォートする.
  832.      *
  833.      * TODO MDB2 に対応するための暫定的な措置.
  834.      *      プレースホルダが使用できない実装があるため.
  835.      *      本来であれば, MDB2::prepare() を適切に使用するべき
  836.      *
  837.      * @see MDB2::quote()
  838.      * @param string $val クォートを行う文字列
  839.      * @return string クォートされた文字列
  840.      */
  841.     function quote($val{
  842.         return $this->conn->quote($val);
  843.     }
  844.  
  845.     /**
  846.      * パラメーターの連想配列から, テーブルに存在する列のみを取得する.
  847.      *
  848.      * @param string $table テーブル名
  849.      * @param array プレースホルダの連想配列
  850.      * @return array テーブルに存在する列のみ抽出した連想配列
  851.      */
  852.     function extractOnlyColsOf($table$arrParams{
  853.         $arrCols $this->listTableFields($table);
  854.         $arrResults array();
  855.         foreach ($arrParams as $key => $val{
  856.             if (in_array($key$arrCols)) {
  857.                 $arrResults[$key$val;
  858.             }
  859.         }
  860.         return $arrResults;
  861.     }
  862.  
  863.     /**
  864.      * プリペアドステートメントを構築する.
  865.      *
  866.      * @access private
  867.      * @param string $sql プリペアドステートメントを構築する SQL
  868.      * @param mixed $types プレースホルダの型指定 デフォルト null
  869.      * @param mixed $result_types 返値の型指定またはDML実行(MDB2_PREPARE_MANIP)、nullは指定無し
  870.      * @return MDB2_Statement_Common プリペアドステートメントインスタンス
  871.      */
  872.     function prepare($sql$types null$result_types MDB2_PREPARE_RESULT{
  873.         $sth =$this->conn->prepare($sql$types$result_types);
  874.         if (PEAR::isError($sth)) {
  875.             if (!$this->force_run{
  876.                 trigger_error($this->traceError($sth$sql)E_USER_ERROR);
  877.             else {
  878.                 error_log($this->traceError($sth$sql)3LOG_REALFILE);
  879.             }
  880.         }
  881.         return $sth;
  882.     }
  883.  
  884.     /**
  885.      * プリペアドクエリを実行する.
  886.      *
  887.      * @access private
  888.      * @param MDB2_Statement_Common プリペアドステートメントインスタンス
  889.      * @param array $arrVal プレースホルダに挿入する配列
  890.      * @return MDB2_Result 結果セットのインスタンス
  891.      */
  892.     function execute(&$sth$arrVal array()) {
  893.         $timeStart SC_Utils_Ex::sfMicrotimeFloat();
  894.         $affected =$sth->execute((array)$arrVal);
  895.  
  896.         // 一定以上時間かかったSQLの場合、ログ出力する。
  897.         if(defined('SQL_QUERY_LOG_MODE'&& SQL_QUERY_LOG_MODE == true{
  898.             $timeEnd SC_Utils_Ex::sfMicrotimeFloat();;
  899.             $timeExecTime $timeEnd $timeStart;
  900.             if(defined('SQL_QUERY_LOG_MIN_EXEC_TIME'&& $timeExecTime >= (float)SQL_QUERY_LOG_MIN_EXEC_TIME{
  901.                 $logMsg sprintf("SQL_LOG [%.2fsec]\n%s"$timeExecTime$sth->query);
  902.                 error_log($logMsg3LOG_REALFILE);
  903.             }
  904.         }
  905.  
  906.         if (PEAR::isError($affected)) {
  907.             $sql = isset($sth->query$sth->query '';
  908.             if (!$this->force_run{
  909.                 trigger_error($this->traceError($affected$sql$arrVal)E_USER_ERROR);
  910.             else {
  911.                 error_log($this->traceError($affected$sql$arrVal)3LOG_REALFILE);
  912.             }
  913.         }
  914.         $this->conn->last_query stripslashes($sth->query);
  915.         return $affected;
  916.     }
  917.  
  918.     /**
  919.      * エラーの内容をトレースする.
  920.      *
  921.      * @access private
  922.      * @param PEAR::Error $error PEAR::Error インスタンス
  923.      * @param string $sql エラーの発生した SQL 文
  924.      * @param array $arrVal プレースホルダ
  925.      * @return string トレースしたエラー文字列
  926.      */
  927.     function traceError($error$sql ""$arrVal false{
  928.         $scheme '';
  929.         if (!empty($_SERVER['HTTPS']&& $_SERVER['HTTPS'!= 'off'{
  930.             $scheme "http://";
  931.         else {
  932.             $scheme "https://";
  933.         }
  934.  
  935.         $err $scheme $_SERVER['HTTP_HOST'$_SERVER['REQUEST_URI'"\n\n"
  936.             . "SERVER_ADDR: " $_SERVER['SERVER_ADDR'"\n"
  937.             . "REMOTE_ADDR: " $_SERVER['REMOTE_ADDR'"\n"
  938.             . "USER_AGENT: " $_SERVER['HTTP_USER_AGENT'"\n\n"
  939.             . "SQL: " $sql "\n\n";
  940.         if ($arrVal !== false{
  941.             $err .= "PlaceHolder: " var_export($arrValtrue"\n\n";
  942.         }
  943.         $err .= $error->getMessage("\n\n";
  944.         $err .= $error->getUserInfo("\n\n";
  945.  
  946.         $err .= SC_Utils_Ex::sfBacktraceToString($error->getBackTrace());
  947.  
  948.         return $err;
  949.     }
  950.  
  951.     /**
  952.      * SQLクエリの結果セットのカラム名だけを取得する
  953.      *
  954.      * @param string $n 実行する SQL 文
  955.      * @param array $arr プレースホルダに挿入する値
  956.      * @param boolean エラーが発生しても処理を続行する場合 true
  957.      * @param mixed $types プレースホルダの型指定 デフォルトnull = string
  958.      * @param mixed $result_types 返値の型指定またはDML実行(MDB2_PREPARE_MANIP)
  959.      * @return array 実行結果の配列
  960.      */
  961.     function getQueryDefsFields($n ,$arr array()$ignore_err false$types null$result_types MDB2_PREPARE_RESULT ){
  962.  
  963.         $n $this->dbFactory->sfChangeMySQL($n);
  964.  
  965.         $sth =$this->prepare($n$types$result_types);
  966.         if (PEAR::isError($sth&& ($this->force_run || $ignore_err)) {
  967.             return;
  968.         }
  969.  
  970.         $result $this->execute($sth$arr);
  971.         if (PEAR::isError($result&& ($this->force_run || $ignore_err)) {
  972.             return;
  973.         }
  974.         $arrRet $result->getColumnNames();
  975.         //PREPAREの解放
  976.         $sth->free();
  977.  
  978.         return $arrRet;
  979.     }
  980.  
  981. }
  982.  
  983. ?>

Documentation generated on Fri, 24 Feb 2012 14:02:54 +0900 by Seasoft